﻿/*
 * Mutex.h
 *
 *  Created on: 2011/05/28
 *      Author: naoki
 */

#ifndef INCLUDED_NTENGINE_THREADING_MUTEX_H
#define INCLUDED_NTENGINE_THREADING_MUTEX_H

namespace NTEngine {
namespace Threading {

/**
 * @brief ミューテックス
 */
class Mutex {
public:
	/**
	 * @brief インスタンスを生成します。
	 */
	static Mutex create();

	/**
	 * @brief 鍵をかけます
	 */
	void lock();

	/**
	 * @brief 鍵を解除します
	 */
	void unlock();

	Mutex();
	~Mutex();
	Mutex( const Mutex& );
	Mutex& operator=( const Mutex& );
	operator void*() const;
	void release();
	bool operator==( const Mutex& ) const;
	bool operator!=( const Mutex& ) const;
	int referenceCount() const;
private:
	class Impl;
	Impl* mImpl;
};

} // namespace Threading
} // namespace NTEngine

#endif // INCLUDED_NTENGINE_THREADING_MUTEX_H
